home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / idlelib / keybindingDialog.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  12KB  |  277 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. '''
  5. Dialog for building Tkinter accelerator key bindings
  6. '''
  7. from Tkinter import *
  8. import tkMessageBox
  9. import string
  10. import os
  11.  
  12. class GetKeysDialog(Toplevel):
  13.     
  14.     def __init__(self, parent, title, action, currentKeySequences):
  15.         '''
  16.         action - string, the name of the virtual event these keys will be
  17.                  mapped to
  18.         currentKeys - list, a list of all key sequence lists currently mapped
  19.                  to virtual events, for overlap checking
  20.         '''
  21.         Toplevel.__init__(self, parent)
  22.         self.configure(borderwidth = 5)
  23.         self.resizable(height = FALSE, width = FALSE)
  24.         self.title(title)
  25.         self.transient(parent)
  26.         self.grab_set()
  27.         self.protocol('WM_DELETE_WINDOW', self.Cancel)
  28.         self.parent = parent
  29.         self.action = action
  30.         self.currentKeySequences = currentKeySequences
  31.         self.result = ''
  32.         self.keyString = StringVar(self)
  33.         self.keyString.set('')
  34.         self.SetModifiersForPlatform()
  35.         self.modifier_vars = []
  36.         for modifier in self.modifiers:
  37.             variable = StringVar(self)
  38.             variable.set('')
  39.             self.modifier_vars.append(variable)
  40.         
  41.         self.CreateWidgets()
  42.         self.LoadFinalKeyList()
  43.         self.withdraw()
  44.         self.update_idletasks()
  45.         self.geometry('+%d+%d' % (parent.winfo_rootx() + (parent.winfo_width() / 2 - self.winfo_reqwidth() / 2), parent.winfo_rooty() + (parent.winfo_height() / 2 - self.winfo_reqheight() / 2)))
  46.         self.deiconify()
  47.         self.wait_window()
  48.  
  49.     
  50.     def CreateWidgets(self):
  51.         frameMain = Frame(self, borderwidth = 2, relief = SUNKEN)
  52.         frameMain.pack(side = TOP, expand = TRUE, fill = BOTH)
  53.         frameButtons = Frame(self)
  54.         frameButtons.pack(side = BOTTOM, fill = X)
  55.         self.buttonOK = Button(frameButtons, text = 'OK', width = 8, command = self.OK)
  56.         self.buttonOK.grid(row = 0, column = 0, padx = 5, pady = 5)
  57.         self.buttonCancel = Button(frameButtons, text = 'Cancel', width = 8, command = self.Cancel)
  58.         self.buttonCancel.grid(row = 0, column = 1, padx = 5, pady = 5)
  59.         self.frameKeySeqBasic = Frame(frameMain)
  60.         self.frameKeySeqAdvanced = Frame(frameMain)
  61.         self.frameControlsBasic = Frame(frameMain)
  62.         self.frameHelpAdvanced = Frame(frameMain)
  63.         self.frameKeySeqAdvanced.grid(row = 0, column = 0, sticky = NSEW, padx = 5, pady = 5)
  64.         self.frameKeySeqBasic.grid(row = 0, column = 0, sticky = NSEW, padx = 5, pady = 5)
  65.         self.frameKeySeqBasic.lift()
  66.         self.frameHelpAdvanced.grid(row = 1, column = 0, sticky = NSEW, padx = 5)
  67.         self.frameControlsBasic.grid(row = 1, column = 0, sticky = NSEW, padx = 5)
  68.         self.frameControlsBasic.lift()
  69.         self.buttonLevel = Button(frameMain, command = self.ToggleLevel, text = 'Advanced Key Binding Entry >>')
  70.         self.buttonLevel.grid(row = 2, column = 0, stick = EW, padx = 5, pady = 5)
  71.         labelTitleBasic = Label(self.frameKeySeqBasic, text = "New keys for  '" + self.action + "' :")
  72.         labelTitleBasic.pack(anchor = W)
  73.         labelKeysBasic = Label(self.frameKeySeqBasic, justify = LEFT, textvariable = self.keyString, relief = GROOVE, borderwidth = 2)
  74.         labelKeysBasic.pack(ipadx = 5, ipady = 5, fill = X)
  75.         self.modifier_checkbuttons = { }
  76.         column = 0
  77.         for modifier, variable in zip(self.modifiers, self.modifier_vars):
  78.             label = self.modifier_label.get(modifier, modifier)
  79.             check = Checkbutton(self.frameControlsBasic, command = self.BuildKeyString, text = label, variable = variable, onvalue = modifier, offvalue = '')
  80.             check.grid(row = 0, column = column, padx = 2, sticky = W)
  81.             self.modifier_checkbuttons[modifier] = check
  82.             column += 1
  83.         
  84.         labelFnAdvice = Label(self.frameControlsBasic, justify = LEFT, text = 'Select the desired modifier keys\n' + 'above, and the final key from the\n' + 'list on the right.\n\n' + 'Use upper case Symbols when using\n' + 'the Shift modifier.  (Letters will be\n' + 'converted automatically.)')
  85.         labelFnAdvice.grid(row = 1, column = 0, columnspan = 4, padx = 2, sticky = W)
  86.         self.listKeysFinal = Listbox(self.frameControlsBasic, width = 15, height = 10, selectmode = SINGLE)
  87.         self.listKeysFinal.bind('<ButtonRelease-1>', self.FinalKeySelected)
  88.         self.listKeysFinal.grid(row = 0, column = 4, rowspan = 4, sticky = NS)
  89.         scrollKeysFinal = Scrollbar(self.frameControlsBasic, orient = VERTICAL, command = self.listKeysFinal.yview)
  90.         self.listKeysFinal.config(yscrollcommand = scrollKeysFinal.set)
  91.         scrollKeysFinal.grid(row = 0, column = 5, rowspan = 4, sticky = NS)
  92.         self.buttonClear = Button(self.frameControlsBasic, text = 'Clear Keys', command = self.ClearKeySeq)
  93.         self.buttonClear.grid(row = 2, column = 0, columnspan = 4)
  94.         labelTitleAdvanced = Label(self.frameKeySeqAdvanced, justify = LEFT, text = "Enter new binding(s) for  '" + self.action + "' :\n" + '(These bindings will not be checked for validity!)')
  95.         labelTitleAdvanced.pack(anchor = W)
  96.         self.entryKeysAdvanced = Entry(self.frameKeySeqAdvanced, textvariable = self.keyString)
  97.         self.entryKeysAdvanced.pack(fill = X)
  98.         labelHelpAdvanced = Label(self.frameHelpAdvanced, justify = LEFT, text = 'Key bindings are specified using Tkinter keysyms as\n' + 'in these samples: <Control-f>, <Shift-F2>, <F12>,\n<Control-space>, <Meta-less>, <Control-Alt-Shift-X>.\nUpper case is used when the Shift modifier is present!\n\n' + "'Emacs style' multi-keystroke bindings are specified as\n" + 'follows: <Control-x><Control-y>, where the first key\n' + "is the 'do-nothing' keybinding.\n\n" + 'Multiple separate bindings for one action should be\n' + 'separated by a space, eg., <Alt-v> <Meta-v>.')
  99.         labelHelpAdvanced.grid(row = 0, column = 0, sticky = NSEW)
  100.  
  101.     
  102.     def SetModifiersForPlatform(self):
  103.         """Determine list of names of key modifiers for this platform.
  104.  
  105.         The names are used to build Tk bindings -- it doesn't matter if the
  106.         keyboard has these keys, it matters if Tk understands them. The
  107.         order is also important: key binding equality depends on it, so
  108.         config-keys.def must use the same ordering.
  109.         """
  110.         import sys as sys
  111.         if sys.platform == 'darwin' and sys.executable.count('.app'):
  112.             self.modifiers = [
  113.                 'Shift',
  114.                 'Control',
  115.                 'Option',
  116.                 'Command']
  117.         else:
  118.             self.modifiers = [
  119.                 'Control',
  120.                 'Alt',
  121.                 'Shift']
  122.         self.modifier_label = {
  123.             'Control': 'Ctrl' }
  124.  
  125.     
  126.     def ToggleLevel(self):
  127.         if self.buttonLevel.cget('text')[:8] == 'Advanced':
  128.             self.ClearKeySeq()
  129.             self.buttonLevel.config(text = '<< Basic Key Binding Entry')
  130.             self.frameKeySeqAdvanced.lift()
  131.             self.frameHelpAdvanced.lift()
  132.             self.entryKeysAdvanced.focus_set()
  133.         else:
  134.             self.ClearKeySeq()
  135.             self.buttonLevel.config(text = 'Advanced Key Binding Entry >>')
  136.             self.frameKeySeqBasic.lift()
  137.             self.frameControlsBasic.lift()
  138.  
  139.     
  140.     def FinalKeySelected(self, event):
  141.         self.BuildKeyString()
  142.  
  143.     
  144.     def BuildKeyString(self):
  145.         keyList = modifiers = self.GetModifiers()
  146.         finalKey = self.listKeysFinal.get(ANCHOR)
  147.         if finalKey:
  148.             finalKey = self.TranslateKey(finalKey, modifiers)
  149.             keyList.append(finalKey)
  150.         
  151.         self.keyString.set('<' + string.join(keyList, '-') + '>')
  152.  
  153.     
  154.     def GetModifiers(self):
  155.         modList = [ variable.get() for variable in self.modifier_vars ]
  156.         return filter(None, modList)
  157.  
  158.     
  159.     def ClearKeySeq(self):
  160.         self.listKeysFinal.select_clear(0, END)
  161.         self.listKeysFinal.yview(MOVETO, '0.0')
  162.         for variable in self.modifier_vars:
  163.             variable.set('')
  164.         
  165.         self.keyString.set('')
  166.  
  167.     
  168.     def LoadFinalKeyList(self):
  169.         self.functionKeys = ('F1', 'F2', 'F2', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12')
  170.         self.alphanumKeys = tuple(string.ascii_lowercase + string.digits)
  171.         self.punctuationKeys = tuple('~!@#%^&*()_-+={}[]|;:,.<>/?')
  172.         self.whitespaceKeys = ('Tab', 'Space', 'Return')
  173.         self.editKeys = ('BackSpace', 'Delete', 'Insert')
  174.         self.moveKeys = ('Home', 'End', 'Page Up', 'Page Down', 'Left Arrow', 'Right Arrow', 'Up Arrow', 'Down Arrow')
  175.         keys = self.alphanumKeys + self.punctuationKeys + self.functionKeys + self.whitespaceKeys + self.editKeys + self.moveKeys
  176.         self.listKeysFinal.insert(END, *keys)
  177.  
  178.     
  179.     def TranslateKey(self, key, modifiers):
  180.         '''Translate from keycap symbol to the Tkinter keysym'''
  181.         translateDict = {
  182.             'Space': 'space',
  183.             '~': 'asciitilde',
  184.             '!': 'exclam',
  185.             '@': 'at',
  186.             '#': 'numbersign',
  187.             '%': 'percent',
  188.             '^': 'asciicircum',
  189.             '&': 'ampersand',
  190.             '*': 'asterisk',
  191.             '(': 'parenleft',
  192.             ')': 'parenright',
  193.             '_': 'underscore',
  194.             '-': 'minus',
  195.             '+': 'plus',
  196.             '=': 'equal',
  197.             '{': 'braceleft',
  198.             '}': 'braceright',
  199.             '[': 'bracketleft',
  200.             ']': 'bracketright',
  201.             '|': 'bar',
  202.             ';': 'semicolon',
  203.             ':': 'colon',
  204.             ',': 'comma',
  205.             '.': 'period',
  206.             '<': 'less',
  207.             '>': 'greater',
  208.             '/': 'slash',
  209.             '?': 'question',
  210.             'Page Up': 'Prior',
  211.             'Page Down': 'Next',
  212.             'Left Arrow': 'Left',
  213.             'Right Arrow': 'Right',
  214.             'Up Arrow': 'Up',
  215.             'Down Arrow': 'Down',
  216.             'Tab': 'tab' }
  217.         if key in translateDict.keys():
  218.             key = translateDict[key]
  219.         
  220.         if 'Shift' in modifiers and key in string.ascii_lowercase:
  221.             key = key.upper()
  222.         
  223.         key = 'Key-' + key
  224.         return key
  225.  
  226.     
  227.     def OK(self, event = None):
  228.         if self.KeysOK():
  229.             self.result = self.keyString.get()
  230.             self.destroy()
  231.         
  232.  
  233.     
  234.     def Cancel(self, event = None):
  235.         self.result = ''
  236.         self.destroy()
  237.  
  238.     
  239.     def KeysOK(self):
  240.         """Validity check on user's keybinding selection"""
  241.         keys = self.keyString.get()
  242.         keys.strip()
  243.         finalKey = self.listKeysFinal.get(ANCHOR)
  244.         modifiers = self.GetModifiers()
  245.         keySequence = keys.split()
  246.         keysOK = False
  247.         title = 'Key Sequence Error'
  248.         if not keys:
  249.             tkMessageBox.showerror(title = title, parent = self, message = 'No keys specified.')
  250.         elif not keys.endswith('>'):
  251.             tkMessageBox.showerror(title = title, parent = self, message = 'Missing the final Key')
  252.         elif not modifiers and finalKey not in self.functionKeys:
  253.             tkMessageBox.showerror(title = title, parent = self, message = 'No modifier key(s) specified.')
  254.         elif modifiers == [
  255.             'Shift'] and finalKey not in self.functionKeys + ('Tab', 'Space'):
  256.             msg = 'The shift modifier by itself may not be used with this key symbol; only with F1-F12, Tab, or Space'
  257.             tkMessageBox.showerror(title = title, parent = self, message = msg)
  258.         elif keySequence in self.currentKeySequences:
  259.             msg = 'This key combination is already in use.'
  260.             tkMessageBox.showerror(title = title, parent = self, message = msg)
  261.         else:
  262.             keysOK = True
  263.         return keysOK
  264.  
  265.  
  266. if __name__ == '__main__':
  267.     root = Tk()
  268.     
  269.     def run():
  270.         keySeq = ''
  271.         dlg = GetKeysDialog(root, 'Get Keys', 'find-again', [])
  272.         print dlg.result
  273.  
  274.     Button(root, text = 'Dialog', command = run).pack()
  275.     root.mainloop()
  276.  
  277.